package com.coderman.daoclient.dao;

import com.coderman.daoclient.bean.KVPair;

import java.util.List;
import java.util.Map;

/**
 * Created by ${fanchunshuai} on 2017-7-26.
 *
 * @version: V1.0
 * @Desc:
 * @Copyright (c) 2017 58到家-版权所有
 */
public interface IDao<T,Key> {

    /**
     * 以对象的方式保存数据
     * @param t
     * @return
     * @throws Exception
     */
    Long insertEntity(T t) throws Exception;

    /**
     * 以对象的方式修改数据
     * @param t
     * @throws Exception
     */
    void updateEntity(T t) throws Exception;

    /**
     * 以对象的方式删除数据
     * @param tClass
     * @param id
     * @throws Exception
     */
    void deleteEntity(Class<T> tClass,Key id) throws Exception;

    /**
     * 以对象的方式获取数据
     * @param tClass
     * @param id
     * @return
     * @throws Exception
     */
    T getById(Class<T> tClass,Key id) throws Exception;

    /**
     * 以对象的方式获取列表数据
     * @param tClass
     * @return
     * @throws Exception
     */
    List<T> getList(Class<T> tClass)throws Exception;

    /**
     * 以对象的方式通过过滤条件字段获取列表数据
     * @param tClass
     * @param kvPairList
     * @return
     * @throws Exception
     */
    List<T> getList(Class<T> tClass, List<KVPair> kvPairList)throws Exception;

    /**
     * 返回key-value形式的键值对，注意key对应的column值不能有空和重复值，
     * 应用有一定限制
     *
     * @param clazzBean
     * @param keyColumn
     * @param valueColumn
     * @return
     * @throws Exception
     */
    Map<String, String> getMap(Class clazzBean, String keyColumn, String valueColumn) throws Exception;

    /**
     * 以对象的方式修改记录
     * 根据column-value的方式修改
     * @param t  对象class
     * @param list  修改的列和值
     * @param idPair  id主键的名称和值
     * @throws Exception
     */
    void updateEntity(Class<T> tClass, List<KVPair> list,KVPair idPair)throws Exception;

}
